Spring Boot之统一日志服务

如何使用切面对Controller层进行统一日志处理。

pom

首先定义依赖。

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

Aspect

接着定义@Aspect类即可:

  1. 需对处理类加上@Component注解,需用到Bean。
  2. 定义一个切点@Pointcut,通常为方法执行时execution(<方法匹配语句>)
  3. 通过@Before@After等注解定义在特定的时机(如上述切点)的行为(如在方法执行前后打印日志)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Aspect
@Component
public class HttpAspect {
private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class);

// 切入点
@Pointcut("execution(public * com.my.controller..*.*(..))")
public void httpLog(){}

// 在切入点前
@Before("httpLog()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("Receiving request: url={}, method={}, ip={}", request.getRequestURI(), request.getMethod(), request.getRemoteAddr());
logger.debug("class+method={} {} args={}", joinPoint.getSignature().getDeclaringTypeName(),
joinPoint.getSignature().getName(), joinPoint.getArgs());
}

// 在切入点后
@After("httpLog()")
public void doAfter() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("Request finished: url={}, method={}, ip={}", request.getRequestURI(), request.getMethod(), request.getRemoteAddr());
}
}

至此,所有Controller的进出均打印日志。